package org.jsola.contract.service;

import org.jsola.contract.constant.AccountType;
import org.jsola.contract.dao.IAccountDAO;
import org.jsola.contract.dto.AccountAddDTO;
import org.jsola.contract.dto.AccountUpdateDTO;
import org.jsola.contract.entity.AccountDO;
import org.jsola.contract.query.AccountQuery;
import org.jsola.contract.vo.AccountListVO;
import org.jsola.contract.vo.AccountVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 账户信息
 *
 * @author JanusMix
 */
public interface IAccountService extends IService<IAccountDAO, AccountDO> {

    /**
     * 新增账户信息
     *
     * @param accountAddDTO 新增账户信息DTO
     * @param tokenUser     当前用户
     * @return 账户信息详情信息
     */
    AccountVO save(AccountAddDTO accountAddDTO, TokenUser tokenUser);

    /**
     * 修改账户信息
     *
     * @param accountUpdateDTO 修改账户信息DTO
     * @param tokenUser        当前用户
     * @return 更新数量
     */
    int update(AccountUpdateDTO accountUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除账户信息，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser  当前用户
     * @param accountIds 账户信息id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... accountIds);

    /**
     * 根据账户信息id查找
     *
     * @param accountId 账户信息id
     * @return 账户信息详情信息
     */
    AccountVO selectById(String accountId);

    /**
     * 根据账户信息id查找
     *
     * @param accountIds 账户信息id
     * @return 账户信息详情信息
     */
    List<AccountVO> selectByIds(List<String> accountIds);

    /**
     * 查询账户信息
     *
     * @param accountQuery 查询条件
     * @return 账户信息列表信息
     */
    List<AccountListVO> select(AccountQuery accountQuery);

    /**
     * 查询账户信息记录数
     *
     * @param accountQuery 查询条件
     * @return 账户信息记录数
     */
    int selectCount(AccountQuery accountQuery);

    /**
     * 分页查询账户信息
     *
     * @param accountQuery 查询条件
     * @return 账户信息列表信息
     */
    Page<AccountListVO> selectPage(AccountQuery accountQuery);


    /**
     * 根据账户信息id查找
     *
     * @param accountId 账户信息id
     * @return 账户信息
     */
    AccountDO selectDOById(String accountId);

    /**
     * 查询账户信息
     *
     * @param accountQuery 查询条件
     * @return 账户信息列表
     */
    List<AccountDO> selectDO(AccountQuery accountQuery);

    /**
     * 查询账户
     *
     * @param type     类型
     * @param memberId 类型下的id，如type是个人，memberId就是用户id
     * @return 账户对象
     */
    AccountDO findAccount(AccountType type, String memberId);

    /**
     * 批量查询账户（同类型）
     *
     * @param type      类型
     * @param memberIds 类型下的ids，如type是个人，memberId就是用户id
     * @return 账户对象
     */
    List<AccountDO> findAccounts(AccountType type, List<String> memberIds);

    /**
     * 更新员工账号的手机号
     *
     * @param oldPhone  旧手机号
     * @param memberId  用户id
     * @param newPhone  新手机号
     * @param tokenUser 当前用户
     */
    void updateUserPhone(String oldPhone, String memberId, String newPhone, TokenUser tokenUser);

    /**
     * 根据第三方账号查找账号信息
     *
     * @param accountId 第三方账号
     * @return 账号信息
     */
    AccountDO selectByAccountId(String accountId);

    /**
     * 根据第三方账号查找账号信息
     *
     * @param accountIds 第三方账号
     * @return 账号信息
     */
    List<AccountDO> selectByAccountIds(List<String> accountIds);
}


